﻿using System;
using System.Collections.Generic;
using System.Linq;
using SapFramework.Interface.Controls.Menus.Attributes;
using SapFramework.Interface.Controls.Menus.Base;

namespace SapFramework.Queries
{
    /// <summary>
    /// Armazena consultas pré-determinadas para o sistema, relacionadas a menus do PadaOne.
    /// </summary>
    public class MenuQueries
    {
        /// <summary>
        /// Deixa separado numa constante o tipo de Form, pra não ter que ficar buscando de tudo quando é canto.
        /// </summary>
        public static readonly Type srTypeMenu = typeof( Menu );

        /// <summary>
        /// Recupera todos os formulários que herdam da classe Form do PadaOne.
        /// </summary>
        /// <returns>Formulários que herdam de Form e não são abstratos</returns>
        public static IEnumerable<Type> GetPadaOneMenus()
        {
            return
                from
                    sAssembly in AppDomain.CurrentDomain.GetAssemblies()
                from
                    sObjType in sAssembly.GetTypes()
                where
                    srTypeMenu.IsAssignableFrom( sObjType ) && !sObjType.IsAbstract
                select
                    sObjType;
        }

        public static MenuTypeAttribute GetMenuTypeAttribute( Type aType )
        {
            Commons.Diagnostics.Debug.Assert.IsSubClassOf( () => aType, srTypeMenu );

            return aType.GetCustomAttributes( typeof(MenuTypeAttribute), true ).SingleOrDefault() as MenuTypeAttribute;
        }
    }
}